From 5677e95f23bc4a643e1c9c9381601bb28a5e405d Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 12 Oct 2005 17:00:29 +0100 Subject: [PATCH] Keir moved barriers, Competence questions are raised: Correctness withers. Signed-off-by: Rusty Russell --- .../drivers/xen/xenbus/xenbus_comms.c | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c index a4842df4af..6a6af390ec 100644 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c @@ -130,7 +130,7 @@ int xb_write(const void *data, unsigned len) wait_event_interruptible(xb_waitq, output_avail(out)); - mb(); + /* Make local copy of header to check for sanity. */ h = *out; if (!check_buffer(&h)) return -EIO; @@ -140,10 +140,20 @@ int xb_write(const void *data, unsigned len) continue; if (avail > len) avail = len; + + /* Make sure we read header before we write data + * (implied by data-dependency, but let's play safe). */ + mb(); + memcpy(dst, data, avail); data += avail; len -= avail; + + /* Other side must not see new header until data is there. */ + wmb(); update_output_chunk(out, avail); + + /* This implies mb() before other side sees interrupt. */ notify_remote_via_evtchn(xen_start_info->store_evtchn); } while (len != 0); @@ -171,7 +181,6 @@ int xb_read(void *data, unsigned len) wait_event_interruptible(xb_waitq, xs_input_avail()); - mb(); h = *in; if (!check_buffer(&h)) return -EIO; @@ -183,13 +192,21 @@ int xb_read(void *data, unsigned len) avail = len; was_full = !output_avail(&h); + /* We must read header before we read data. */ + rmb(); + memcpy(data, src, avail); data += avail; len -= avail; + + /* Other side must not see free space until we've copied out */ + mb(); + update_input_chunk(in, avail); pr_debug("Finished read of %i bytes (%i to go)\n", avail, len); /* If it was full, tell them we've taken some. */ if (was_full) + /* Implies mb(): they will see new header. */ notify_remote_via_evtchn(xen_start_info->store_evtchn); } -- 2.30.2